Ажурирање вредности променљивих
Дефинисањем променљиве у програму ми јој додељујемо неку вредност. У досадашњим задацима смо могли да променљивама додељујемо вредност само једном, приликом њиховог дефинисања. На тај начин променљиве све време имају исту вредност током рада програма. У итеративним поступцима које ћемо сада упознати, биће потребно да променљивама мењамо вредности током извршавања програма (тиме се и оправдава њихов назив - променљиве). У наставку ћемо описати елементе програмског језика који се тичу измене (ажурирања) постојећих вредности променљивих.
Елементи програмског језика
Променљива може променити своју вредност тако што јој се
додели нова вредност. На пример, наредни програм
исписује 1, а затим 2, јер се током његовог извшавања вредност
променљиве x мења са 1 на 2.
x = 1;
cout << x << endl;
x = 2;
cout << x << endl;Често нова вредност променљиве зависи од њене старе вредности. Чест
случај јесте повећање вредности неке променљиве за 1 (на пример,
приликом пребројавања колико има објеката који задовољавају неки скуп
услова), а наравно могуће је повећати вредност променљиве и за неку
другу вредност која је различита од 1 (на пример, приликом рачунања суме
бројева из неког датог скупа суму ћемо увећавати за вредност сваког од
елемената тог скупа). Некад је потребно смањити текућу вредност
променљиве, повећати je одређени број пута или смањити одређен број
пута. Oваква измена променљиве x може се постићи изразом
облика x = x op v, где је op неки од наведених
оператора +, -, *, /, а v вредност за коју се
променљива мења. На пример, наредбом zbir = zbir + a
вредност променљиве zbir се увећава за вредност променљиве
a, док се наредбом stepen = stepen * 2
вредност променљиве stepen увећава два пута. Ове наредбе не
треба мешати са сличним записима из математике, који имају сасвим
другачије значење (нпр. x = x + 1 би у математици могло да
представља једначину која нема решења).
Наредбе додељивања вредности облика x = x op v могу се
скраћено записати као x op= v и у пракси се често користи
скраћени запис. На пример, уместо писања zbir = zbir + x,
можемо скраћено записати zbir += x. Оператори доделе
+=, -=, *=, /=
називају се сложени оператори доделе. Поред наведених
оператора као сложени оператор може се користити и оператор
%=, али је његова употреба ређа од осталих сложених
оператора доделе.
На располагању имамо и унарни оператор
инкрементирања ++ којим се вредност неке
променљиве повећава за 1 и унарни оператор
декрементирања -- којим се вредност променљиве
смањује за 1. Ови оператори имају највиши приоритет од свих оператора.
Оно што је важно поменути јесте да оба оператора имају две варијанте:
префиксну и постфиксну. Оне се
разликују у следећем: вредност израза x++ je вредност
променљиве x пре увећања њене вредности, док је вредност
израза ++x увећана вредност променљиве x.
Дакле, наредни фрагмент кода:
int x = 5;
cout << x << endl;
cout << x++ << endl;
cout << x << endl;
cout << ++x << endl;би исписивао редом вредности 5 (иницијална вредност променљиве), 5
(вредност израза x++), 6 (вредност променљиве
x након операције инкрементирања) и 7 (вредност израза
++x). У решењима у овој збирци обично се нећемо ослањати на
вредност израза са операторима инкрементирања и декрементирања
(користићемо их обично изоловано, само да би се повећала или смањила
вредност променљиве).
Улазно-излазни параметри функција
Измена вредности променљивих некада се врши и у функцијама. Функција
као улазни параметар може примити стару, а као резултат вратити нову
жељену вредност променљиве и измена вредности променљиве се тада врши на
месту позива функције (изразом облика x = f(x)). На
пример,
int PovecajZaDva(int x) {
return x + 2;
}
int main() {
int x = 0;
cout << "Pocetna vrednost x je " << x << endl;
x = PovecajZaDva(x);
cout << "Nova vrednost x je " << x << endl;
return 0;
}Променљиве се у функцију преносе по вредности, што значи да се у функцијама праве копије променљивих и измена вредности променљивих у функцијама се не преноси аутоматски на вредности променљивих коришћених у позиву. Илуструјмо ово примером.
void PovecajZaDva(int x) {
cout << "Vrednost x na ulazu u funkciju je " << x << endl;
x = x + 2;
cout << "Vrednost x na izlazu iz funkcije je " << x << endl;
}
int main() {
int x = 0
cout << "Pocetna vrednost x je " << x << endl;
PovecajZaDva(x);
cout << "Nova vrednost x je " << x << endl;
}На почетку главне функције main
променљива x има вредност 0. Она се
преноси у функцију тако што функција има своју копију променљиве
x која се такође иницијализује на 0 (јер је то вредност
наведена у позиву). У функцији се та копија увећава за два и на излазу
из функције исписује се да је вредност променљиве x једнака
2. Међутим, по повратку у главну функцију
копија нестаје, а оригинално x и даље
има вредност 0.
Видели смо раније да функција може имати улазне и излазне параметре.
Међутим, понекад имамо потребу да дефинишемо функције које имају
улазно-излазне параметре: њима се преносе почетне вредности у саму
функцију, али се након извршавања функције путем њих враћају и
резултујуће вредности. То је могуће урадити преносом по
референци. Нећемо у овом тренутку детаљно
објашњавати како референце функционишу, већ нам је довољно да знамо да
их користимо тако што иза типа параметра наведемо симбол
&. На пример, уколико функција треба да повећа за два
вредност свог аргумента, то можемо урадити посредством улазно-излазних
параметара.
void PovecajZaDva(int& x) {
x = x + 2;
}Позив ове функције се врши на следећи начин.
int main() {
int x = 0
cout << "Pocetna vrednost x je " << x << endl;
PovecajZaDva(x);
cout << "Nova vrednost x je " << x << endl;
}Улазно-излазни аргументи морају бити иницијализовани пре позива функције.
У овом случају се у функцији не прави копија променљиве
x већ се ради са променљивом прослеђеном у позиву (имена
променљивих не морају бити једнака), тако да функција даје жељени ефекат
и програм исписује да је почетна вредност променљиве x
нула, а да је нова вредност два.
Једна од честих употреба референци у функцијама јесте за потребе размене вредности аргумената функције. На пример, можемо дефинисати функцију која размењује вредност две задате променљиве.
void razmeni(int& a, int& b) {
int tmp = a;
a = b;
b = tmp;
}У језику C++, размена се може извршити библиотечком функцијом
swap декларисаном у заглављу
<algorithm>.
Ажурирање вредности променљивих
Дефинисањем променљиве у програму ми јој додељујемо неку вредност. У досадашњим задацима смо могли да променљивама додељујемо вредност само једном, приликом њиховог дефинисања. На тај начин променљиве све време имају исту вредност током рада програма. У итеративним поступцима које ћемо сада упознати, биће потребно да променљивама мењамо вредности током извршавања програма (тиме се и оправдава њихов назив - променљиве). У наставку ћемо описати елементе програмског језика који се тичу измене (ажурирања) постојећих вредности променљивих.
Елементи програмског језика
Променљива може променити своју вредност тако што јој се
додели нова вредност. На пример, наредни програм
исписује 1, а затим 2, јер се током његовог извшавања вредност
променљиве x мења са 1 на 2.
x = 1;
Console.WriteLine(x);
x = 2;
Console.WriteLine(x);Често нова вредност променљиве зависи од њене старе вредности. Чест
случај јесте повећање вредности неке променљиве за 1 (на пример,
приликом пребројавања колико има објеката који задовољавају неки скуп
услова), а наравно могуће је повећати вредност променљиве и за неку
другу вредност која је различита од 1 (на пример, приликом рачунања суме
бројева из неког датог скупа суму ћемо увећавати за вредност сваког од
елемената тог скупа). Некад је потребно смањити текућу вредност
променљиве, повећати je одређени број пута или смањити одређен број
пута. Oваква измена променљиве x може се постићи изразом
облика x = x op v, где је op неки од наведених
оператора +, -, *, /, а v вредност за коју се
променљива мења. На пример, наредбом zbir = zbir + a
вредност променљиве zbir се увећава за вредност променљиве
a, док се наредбом stepen = stepen * 2
вредност променљиве stepen увећава два пута. Ове наредбе не
треба мешати са сличним записима из математике, који имају сасвим
другачије значење (нпр. x = x + 1 би у математици могло да
представља једначину која нема решења).
Наредбе додељивања вредности облика x = x op v могу се
скраћено записати као x op= v и у пракси се често користи
скраћени запис. На пример, уместо писања zbir = zbir + x,
можемо скраћено записати zbir += x. Оператори доделе
+=, -=, *=, /=
називају се сложени оператори доделе. Поред наведених
оператора као сложени оператор може се користити и оператор
%=, али је његова употреба ређа од осталих сложених
оператора доделе.
На располагању имамо и унарни оператор
инкрементирања ++ којим се вредност неке
променљиве повећава за 1 и унарни оператор
декрементирања -- којим се вредност променљиве
смањује за 1. Ови оператори имају највиши приоритет од свих оператора.
Оно што је важно поменути јесте да оба оператора имају две варијанте:
префиксну и постфиксну. Оне се
разликују у следећем: вредност израза x++ je вредност
променљиве x пре увећања њене вредности, док је вредност
израза ++x увећана вредност променљиве x.
Дакле, наредни фрагмент кода:
int x = 5;
Console.WriteLine(x);
Console.WriteLine(x++);
Console.WriteLine(x);
Console.WriteLine(++x);би исписивао редом вредности 5 (иницијална вредност променљиве), 5
(вредност израза x++), 6 (вредност променљиве
x након операције инкрементирања) и 7 (вредност израза
++x). У решењима у овој збирци обично се нећемо ослањати на
вредност израза са операторима инкрементирања и декрементирања
(користићемо их обично изоловано, само да би се повећала или смањила
вредност променљиве).
Улазно-излазни параметри функција
Измена вредности променљивих некада се врши и у функцијама. Функција
као улазни параметар може примити стару, а као резултат вратити нову
жељену вредност променљиве и измена вредности променљиве се тада врши на
месту позива функције (изразом облика x = f(x)). На
пример,
static int PovecajZaDva(int x)
{
return x + 2;
}
static void Main()
{
int x = 0;
Console.WriteLine("Pocetna vrednost x je " + x);
x = PovecajZaDva(x);
Console.WriteLine("Nova vrednost x je " + x);
}Променљиве се у функцију преносе по вредности, што значи да се у функцијама праве копије променљивих и измена вредности променљивих у функцијама се не преноси аутоматски на вредности променљивих коришћених у позиву. Илуструјмо ово примером.
static void PovecajZaDva(int x)
{
Console.WriteLine("Vrednost x na ulazu u funkciju je " + x);
x = x + 2;
Console.WriteLine("Vrednost x na izlazu iz funkcije je " + x);
}
static void Main()
{
int x = 0
Console.WriteLine("Pocetna vrednost x je " + x);
PovecajZaDva(x);
Console.WriteLine("Nova vrednost x je " + x);
}На почетку главне функције Main
променљива x има вредност 0. Она се
преноси у функцију тако што функција има своју копију променљиве
x која се такође иницијализује на 0 (јер је то вредност
наведена у позиву). У функцији се та копија увећава за два и на излазу
из функције исписује се да је вредност променљиве x једнака
2. Међутим, по повратку у главну функцију
копија нестаје, а оригинално x и даље
има вредност 0.
Видели смо раније да функција може имати улазне и излазне параметре.
Међутим, понекад имамо потребу да дефинишемо функције које имају
улазно-излазне параметре: њима се преносе почетне вредности у саму
функцију, али се након извршавања функције путем њих враћају и
резултујуће вредности. То је могуће урадити преносом по
референци. Нећемо у овом тренутку детаљно
објашњавати како референце функционишу, већ нам је довољно да знамо да
их користимо тако што испред типа параметра наведемо кључну реч
ref. На пример, уколико функција треба да повећа за два
вредност свог аргумента, то можемо урадити посредством улазно-излазних
параметара.
static void PovecajZaDva(ref int x)
{
x = x + 2;
}Позив ове функције се врши на следећи начин.
static int Main()
{
int x = 0
Console.WriteLine("Pocetna vrednost x je " + x);
PovecajZaDva(ref x);
Console.WriteLine("Nova vrednost x je " + x);
}Улазно-излазни аргументи морају бити иницијализовани пре позива функције.
У овом случају се у функцији не прави копија променљиве
x већ се ради са променљивом прослеђеном у позиву (имена
променљивих не морају бити једнака), тако да функција даје жељени ефекат
и програм исписује да је почетна вредност променљиве x
нула, а да је нова вредност два.
Једна од честих употреба референци у функцијама јесте за потребе размене вредности аргумената функције. На пример, можемо дефинисати функцију која размењује вредност две задате променљиве.
static void Razmeni(ref int a, ref int b)
{
int tmp = a;
a = b;
b = tmp;
}